#include "simul.h"
#ifndef RM_SCHEDULE_H
#define RM_SCHEDULE_H

typedef struct task_struct Task;
typedef struct global_domain Cluster;
typedef struct core_domain Core;

void taskNew(Task *task, Core *core);   //新的任务就绪时 入队列操作

Task *taskExit(Task *task, Core *core); //任务完成退出时

void taskFail(Task *task, Core *core);  //任务发生错误

void taskRecover(Task *task, Core *core);  //任务恢复

/* ------------------------RM(Rate-Monotonic)------------------------------ */
void sched_queueTrans(Task *task,ready_queue_node *newqueue,ready_queue_node *lastqueue);

void sched_EnqueueLocal(Task *task, Core *target_core); //加入就绪队列

void sched_DequeueLocal(Task *task, Core *target_core); //退出就绪队列

Core *sched_GetCore(int core_id);   //根据处理器号获得处理器

Core *sched_GetTaskDom(Task *task); //根据任务获得任务所在处理器

void sched_SetLocalSchedTask(Task *task, Core *core);   //将任务放到处理器上执行开始

void sched_PrioTake(Core *core);    //判断当前处理器就绪队列与当前任务是否抢占 抢占执行任务

void sched_Schedule(Core *core);    //执行任务

void Dequeue_table_task(Task *task,Core *core);

void Enqueue_table_task(Task *task,Core *core);

void show_readyqueue( Core *target_core);

void show_suspendqueue(ready_queue_node *queue);

void sched_suspendQueue(Task *task, Core *target_core);

void sched_suspendDequeue(Task *task, Core *target_core);

void show_waitqueue();

int get_minU_core();

double get_utilization(Core *core);

double get_resource_utilization(Core *core);

double get_table_utilization(Core *core);

double get_rt_utilization(Core *core);

#endif // RM_SCHEDULE_H
